﻿/// <reference path="core/Error.js"/>

/// <param name="parameterName" type="ParameterType" integer="true|false" domElement="true|false" mayBeNull="true|false" elementType="ArrayElementType" elementInteger="true|false" elementDomElement="true|false" elementMayBeNull="true|false" locid="descriptionID" parameterArray="true|false" optional="true|false" value="code">description</param>
"use strict";

var Namespace = function (nsName) {
    /// <summary>定义命名空间</summary>
    /// <param name="nsName" type="String" >命名空间名称</param>

    var parent = window;
    //处理多层命名空间
    nsName.split('.').forEach(function (nsItem) {
        //不存在才创建命名空间
        if (!parent[nsItem]) {

            var ns = Object.create(null);

            //类型属性
            Object.defineProperties(ns,
                {
                    'typeOf': {
                        value: 'Namespace'
                    },
                    'parentOf': {
                        value: parent
                    },
                    'nameOf': {
                        value: parent == window ? nsItem : parent.name + '.' + nsItem
                    }
                });

            //方法
            Object.defineProperty(ns, 'defineClass',
                {
                    value: function (csName, reference, ctor) {
                        /// <summary>定义类型</summary>
                        /// <param name="csName" type="String" >类型名称</param>
                        /// <param name="reference" type="Array" >引用对象</param>
                        /// <param name="ctor" type="Function" >构造函数</param>

                        // 重载
                        if (typeof reference === 'function' && !ctor) {
                            ctor = reference;
                            reference = [];
                        }

                        if (ns[csName]) {
                            if (ns[csName].typeof == 'Namespace')
                                throw Error.defineError('', nsName + '.' + csName + '已经作为命名空间被使用！');
                            else
                                throw Error.defineError('', '已经在命名空间' + nsName + '定义了一个名为' + csName + '的对象！');
                        };

                        var cs = function () {
                            //this.prototype = ctor.apply(this, arguments);
                            return ctor.apply(this, arguments)
                            //if (_isDebug) { return ctor(null); };
                        };
                        
                        //类型属性
                        Object.defineProperties(cs,
                            {
                                'typeOf': {
                                    value: 'Class'
                                },
                                'parentOf': {
                                    value: ns
                                },
                                'nameOf': {
                                    value: ns.name + '.' + csName
                                }
                            });
                        ns[csName] = cs;
                    }
                });
            ns.defineEnum = function (emName, jsonValues) {
                /// <summary>定义枚举</summary>
                /// <param name="emName" type="String" >枚举名称</param>
                /// <param name="jsonValues" type="JSON" >枚举值</param>
                emName += 'Enum';

                var em = Object.create(null);
                //类型属性
                Object.defineProperties(em,
                    {
                        'typeOf': {
                            value: 'Enum'
                        },
                        'parentOf': {
                            value: ns
                        },
                        'nameOf': {
                            value: ns.name + '.' + emName
                        }
                    });
                //值
                for (var jsonName in jsonValues) {
                    Object.defineProperty(em, jsonName,
                        {
                            value: jsonValues[jsonName]
                        });
                };

                Object.freeze(em);
                ns[emName] = em;
            };

            parent[nsItem] = ns;
        };

        parent = parent[nsItem];
    });
};

//定义全局变量
var
    $w = $(window),
    $d = $(document)
;